#ifndef SPECIALISTE_H
#define SPECIALISTE_H 1

#include "Classe.h"

using namespace std;

/**
 * Cette classe implémente le mage spécialiste de l'univers AD&D.
 *
 * @author Johan "Solo" Luisier
 */

class Specialiste : public Classe
{
 protected:
  static const unsigned nbrCompetences, /**< Nombre de compétences disponibles */
    nbrRestrictions, /**<  Nombre de restritions disponibles */
    nbrRestrictionsUI,/**< Nombre de restrictions disponible en mode graphique */
    ppAlloues; /**< Nombre de pp alloués. */
  static const vector<CompetenceClasse> Comp, /**< Liste de compétences @see CompetenceClasse */
    Restric; /**< Liste de restrictions @see ListCom */
  static const vector< EnsembleCompetencesClasse > quelSpecialiste; /**< Nom des Spécialistes */
  static const vector< vector< unsigned > > ecolesMagie;/**< Corespondance spécialiste - écoles accessibles */
  static const unsigned nbrSpecialisations, /**< Nombre de spécialistes*/
    nbrEcoles; /**< Nombre max d'école pour un spécialiste */
  /**
   * Enseble des prérequis sur les traits.
   */
  static const vector< vector< Prerequis > > Limites;
  /**
   * Ensemble des races autorisées pour cette Classe.
   */
  static const vector< set< string > > RacesAdmises;
  void calculNiveau();
  unsigned calculeTAc0() const;
  void calculNivMag();
 public:
  Specialiste(unsigned xp, const vector< unsigned >& trait, unsigned& PP,
       const string& race);
  Specialiste( unsigned xp );
  Specialiste( const bool& UI );
  Specialiste( Classe *ptr );
  ~Specialiste();
  void js(unsigned *tab) const;
  const vector<unsigned>* getEnsembleCompetences(const unsigned& nbr) const;
  void ecrireSorts( const string& nom_fichier, const bool& ecrase,
		    const unsigned& sagesse = -1u ) const;
  void sortsParNiveau( vector< unsigned >& sorts,
		       const unsigned& sagesse ) const;
  void ajoutSorts();
  void prixAcces(map<string, unsigned>*& Map) const;
  unsigned aSpecialisation() const;
};

#endif // SPECIALISTE_H
